// 使用这些方法，仍然需要注意数值范围、舍入策略和比较运算等方面的问题，根据具体的应用场景进行适当的调整和处理。
const math = {
    // 加法运算
    add (a, b) {
        const precision = Math.max(getPrecision(a), getPrecision(b));
        const multiplier = Math.pow(10, precision);
        const result=(Math.round(a * multiplier) + Math.round(b * multiplier)) / multiplier;
        return transferToNumber(result)
    },
 
    // 减法运算
    subtract (a, b) {
        return transferToNumber(math.add(a, -b));
    },
 
    // 乘法运算
    multiply (a, b) {
        const precision = getPrecision(a) + getPrecision(b);
        const multiplier = Math.pow(10, precision);
        const result=(Math.round(a * multiplier) * Math.round(b * multiplier)) / (multiplier * multiplier);
        return transferToNumber(result)
    },
 
    // 除法运算
    divide (num1, num2) {
        var str1 = Number(num1).toString(),
            str2 = Number(num2).toString(),
            result,
            str1Length,
            str2Length;
        //解决整数没有小数点方法
        try {
            str1Length = str1.split(".")[1].length;
        } catch (error) {
            str1Length = 0;
        }
        try {
            str2Length = str2.split(".")[1].length;
        } catch (error) {
            str2Length = 0;
        }
        var step = Math.pow(10, Math.max(str1Length, str2Length));
        result = (num1 * step) / (num2 * step);
        return transferToNumber(result);
    },
 
    // 获取浮点数的小数位数
};
const getPrecision = (num) => {
    const str = String(num);
    const decimalIndex = str.indexOf(".");
    return decimalIndex === -1 ? 0 : str.length - decimalIndex - 1;
}
// 处理出现科学计数法
const transferToNumber = (num) => {
    if (isNaN(num)) {
      return num
    }
    num = '' + num
    num = parseFloat(num)
    let eformat = num.toExponential() // 转换为标准的科学计数法形式（字符串）
    let tmpArray = eformat.match(/\d(?:\.(\d*))?e([+-]\d+)/) // 分离出小数值和指数值
    let number = num.toFixed(Math.max(0, (tmpArray[1] || '').length - tmpArray[2]))
    return number 
}
export default math;